﻿#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	下面定义一个函数指针变量
	在前面，我们已经知道了函数名与函数名的地址是相同的，故下面两种定义函数指针的方式都是OK的
	int(*pf)(a, b) = &Add;
	int(*pf)(a, b) = Add;
	函数指针变量的类型是int(*)(int,int)与数组指针类似


	函数指针变量来调用函数也有多种形式
	如果要使用解引用（*）可以使用一个或者好几个（无所谓）但是必须要用括号括起来
	也可以之间使用函数指针变量名（不加*）
	int ret = (*pf)(a, b);
	int ret = (***pf)(a, b);
	int ret = pf(a, b);


	printf("%d", ret);
	return 0;
}

int Add(int x,int y)
{
	return x + y;
}

int main()
{
	下面打印函数名和函数名地址的地址，发现两者是相同的
	printf("Add  = %p\n", Add);
	printf("&Add = %p\n",&Add);
	但是咱们在使用调用函数时，发现&Add是不能够用于函数调用的
	int ret = &Add(3, 4);//err
	int ret = Add(3, 4);//ok
	printf("%d\n", ret);
	return 0;
}


int main()
{
	( *( void (*)() )0 ) ();
	/*这串代码，咱们可以层层剥开分析：首先我们可以看中间的 void (*)()这就是咱们刚刚学习的指针变量类型
	( void (*)() )0，这是一个强制类型转换，这里的数字0就是一个地址0
	*( void (*)() )0将函数类型指针解引用之后就是一个函数了
	最后我们可以看出( *( void (*)() )0 ) ()是一个函数调用（形如Add() )*/
	return 0;
}

int main()
{
	void ( *signal(int, void(*)(int)) )(int);
	/*这串代码，咱们来层层分析：中间的signal(int, void(*)(int))是一个有两个参数的函数（只有函数名与函数参数，那么函数类型就是前面的）
	由上面的分析，咱们将void (*)(int)拿出来，可以清楚地看到这是一个函数指针类型
	故我们可以得出结论：这是一个以signal为函数名，void（*）（int)为函数类型的函数声明*/
	return 0;
}


int Add(int x, int y)
{
	return x + y;
}
typedef是一个关键词，它的作用就是给一个数据类型重新命名
typedef unsigned  int uint;
注意：数组指针变量和函数指针变量中的指针类型重新命名时要将新的类型名字放在括号里的*旁边
typedef int(*p_t)[3];
typedef int(*pf_t)(int, int);
int main()
{
	unsigned int a = 100;
	uint b = 90;


	int arr[3] = { 0 };
	int(*p)[3] = &arr;  //int(*)[3] p 前面一大串是数组指针变量p的类型，换成简写就是下面的形式
	p_t p = &arr;
	for (int i = 0; i < 3; i++)
	{
		printf("%d ", *(*p + i));
	}


	int(*pf)(int, int) = Add;//int(*)(int ,int)是函数指针变量pf的类型
	pf_t pf = Add;
	return 0;
}


int Add(int x, int y)
{
	return x + y;
}

int Sub(int x, int y)
{
	return x - y;
}

int Mul(int x, int y)
{
	return x * y;
}

int Div(int x, int y)
{
	return x / y;
}

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);

	在上面，我们已经将想要的函数都已经定义好了，现在我们将这些函数放入函数指针变量中去
	int(*pf1)(int, int) = Add;
	int(*pf2)(int, int) = Sub;
	int(*pf3)(int, int) = Mul;
	int(*pf4)(int, int) = Div;
	下面是一个函数指针数组，将上面四个函数指针变量存进去，然后遍历使用
	int(*pf[4])(int, int) = { Add,Sub,Mul,Div };
	for (int i = 0; i < 4; i++)
	{
		int ret = pf[i](a, b);
		printf("%d \n", ret);
	}
	return 0;
}

写一个计算器
int Add(int x, int y)
{
	return x + y;
}

int Sub(int x, int y)
{
	return x - y;
}

int Mul(int x, int y)
{
	return x * y;
}

int Div(int x, int y)
{
	return x / y;
}

void menu()
{
	printf("**********************\n");
	printf("** 0.exit   1.Add*****\n");
	printf("***2.Sub    3.Mul*****\n");
	printf("***4.Div *************\n");
	printf("**********************\n");

}

int main()
{
	int a = 0;
	int b = 0;
	int input = 0;
	int ret = 0;
	do
	{
		menu();
		scanf("%d", &input);
		switch (input) 
		{
		case 0:
			printf("退出计算器\n");
			break;
		case 1:
			printf("请输入两个操作数：");
			scanf("%d %d", &a, &b);
			ret=Add(a, b);
			printf("%d ", ret);
			break;
		case 2:
			printf("请输入两个操作数：");
			scanf("%d %d", &a, &b);
			ret = Sub(a, b);
			printf("%d ", ret);
			break;
		case 3:
			printf("请输入两个操作数：");
			scanf("%d %d", &a, &b);
			 ret = Mul(a, b);
			printf("%d ", ret);
			break;
		case 4:
			printf("请输入两个操作数：");
			scanf("%d %d", &a, &b);
			ret = Div(a, b);
			printf("%d ", ret);
			break;
		default:
			printf("选择错误，请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a / b;
}
int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表 
	do
	{
		printf("*************************\n");
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \n");
		printf(" 0:exit \n");
		printf("*************************\n");
		printf("请选择：");
		scanf("%d", &input);
		if ((input <= 4 && input >= 1))
		{
			printf("请输入操作数：");
			scanf("%d %d", &x, &y);
			ret = (*p[input])(x, y);
			printf("ret = %d\n", ret);
		}
		else if (input == 0)
		{
			printf("退出计算器\n");
		}
		else
		{
			printf("输入错误，请重新选择\n");
		}
	}
		while (input);
		return 0;
	}
